Intenté subir la imagen a firebase y ahora no puedo obtener la URL de la imagen.
Subí la imagen con éxito y no puedo obtener el enlace URL de la imagen
const firebaseAdmin = require('firebase-admin'); const { v4: uuidv4 } = require('uuid'); // change the path of json file const serviceAccount = require('./nodejs-be-upload-image-firebase-adminsdk-vzkga-bd1696a09f.json'); const admin = firebaseAdmin.initializeApp({ credential: firebaseAdmin.credential.cert(serviceAccount), }); const storageRef = admin.storage().bucket('gs://nodejs-be-upload-image.appspot.com'); async function uploadFile(path, filename) { // Upload the File const storage = await storageRef.upload(path, { public: true, destination: `/uploads/${filename}`, metadata: { firebaseStorageDownloadTokens: uuidv4(), cacheControl: 'public, max-age=315360000', contentType: 'image/jpeg', }, }); //I want to get the URL of the image here return storage[0]; // return storage[0].metadata.mediaLink; } module.exports = { uploadFile };El SDK de administración de Firebase envuelve el SDK de Google Cloud Storage, por lo que sus API son las mismas. El SDK de Cloud Storage no ofrece direcciones URL de descarga que sean exactamente iguales a las proporcionadas por los SDK móviles y web.
Al configurar la imagen o el archivo como público ( public: true ), no podrá configurar metadatos personalizados de firebaseStorageDownloadTokens .
Hay algunas formas de obtener la URL pública de un archivo cargado.
Usando getSignedUrl :
const admin = firebaseAdmin.initializeApp({ credential: firebaseAdmin.credential.cert({ // serviceAccount }), }); const gs = 'gs://' const bucketName = '<project-id>.appspot.com'; const storageRef = admin.storage().bucket(`${gs}${bucketName}`); async function uploadFile(path, filename) { // Upload the File const destination = `uploads/${filename}`; const storage = await storageRef.upload(path, { public: true, destination: destination, }) .then(() => { const file = storageRef.file(destination); return file.getSignedUrl({ action: 'read', expires: '03-25-2023' }).then(signedUrls => { // signedUrls[0] contains the file's public URL console.log(signedUrls[0]); }); }); }Usando el enlace de almacenamiento en la nube:
async function uploadFile(path, filename) { // Upload the File const destination = `uploads/${filename}`; const storage = await storageRef.upload(path, { public: true, destination: destination, }) .then(() => { console.log(`https://storage.googleapis.com/${bucketName}/${destination}`); }); } Si realmente desea usar customMetadata que tiene firebaseStorageDownloadTokens , le sugiero que use los SDK web en su lugar. Aquí está la documentación para empezar: